package bookshelf.server;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;
import javax.jdo.Transaction;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

import bookshelf.client.book.BookItem;
import bookshelf.server.jdo.MyBookJdo;
import bookshelf.server.util.PMF;

public class BookItemCreator {

	private static final Logger log = Logger.getLogger(BookItemCreator.class
			.getName());

	// public BookItem createBookItem(){
	// BookItem bi = new BookItem();
	// bi.setTitle("フロイト入門");
	// bi.setAuthor("妙木浩之");
	// bi.setPublisher("筑摩書房");
	//		
	// return bi;
	// }

	public ArrayList<BookItem> getBookItems() {

		ArrayList<BookItem> list = new ArrayList<BookItem>();
		BookItem bi;

		List<MyBookJdo> books = null;

		// 永続化マネージャ生成
		PersistenceManager pm = PMF.get().getPersistenceManager();

		try {
			// テストデータの生成
			createTestBookData(pm);

			// 永続化したオブジェクトの取り出し
			books = getBooks(pm);
			
			if (books.isEmpty()) {
				log.info("empty");
			} else {
				for (MyBookJdo mb : books) {
					log.info("key:" + mb.getEncodedKey());
					bi = new BookItem();
					bi.setTitle(mb.getTitle());
					bi.setAuthor("test");
					bi.setSeries("test");
					bi.setPublisher("test");
					list.add(bi);
				}
			}


		} catch (Exception e) {
			e.printStackTrace();
		}
		pm.close();


//		BookItem bi1 = new BookItem();
//		bi1.setTitle("フロイト入門");
//		bi1.setAuthor("妙木浩之");
//		bi1.setSeries("ちくま新書");
//		bi1.setPublisher("筑摩書房");
//		list.add(bi1);

		// BookItem bi2 = new BookItem();
		// bi2.setTitle("Winnyの技術");
		// bi2.setAuthor("金子勇");
		// bi2.setSeries("");
		// bi2.setPublisher("ASCII");
		// list.add(bi2);
		//
		// BookItem bi3 = new BookItem();
		// bi3.setTitle("カラマーゾフの兄弟");
		// bi3.setAuthor("ドフトエフスキー");
		// bi3.setPublisher("光文社");
		// bi3.setSeries("光文社古典新訳文庫");
		// list.add(bi3);

		return list;
	}

	private String storeBook(PersistenceManager pm, String title)
			throws Exception {

		String key = "";

		// クラス名の取得
		// String cls_name = MyBookJdo.class.getSimpleName();
		// オブジェクト一意Keyの生成
		// Key book_key = createKey(cls_name, title);
		// result = book_key;

		// bookオブジェクト生成
		MyBookJdo mybook = new MyBookJdo();
		// mybook.setKey(book_key);
		//TODO generate key by user
		mybook.setKeyName(title);
		mybook.setTitle(title);

		// 永続化
		pm.makePersistent(mybook);

		return key;
	}

	//本オブジェクト全件取得
	private List<MyBookJdo> getBooks(PersistenceManager pm) throws Exception {

		List<MyBookJdo> books = null;

		// String query = "select from " + MyBookJdo.class.getSimpleName();
		String query = "select from " + MyBookJdo.class.getName();
		log.info("JDO Query:" + query);

		books = (List<MyBookJdo>) pm.newQuery(query).execute();

		if (books.isEmpty()) {
			log.info("empty");
		} else {
			for (MyBookJdo mb : books) {
				log.info("key:" + mb.getEncodedKey());
			}
		}

		return books;

	}

	// 全件削除
	private boolean deleteBooks(PersistenceManager pm) throws Exception {
		boolean result = false;

		// Transaction tx = pm.currentTransaction();

		List<MyBookJdo> books = getBooks(pm);

		if (books.isEmpty()) {
			log.info("empty");
		} else {
			// pm.deletePersistentAll(books);
			for (MyBookJdo mb : books) {
				// tx.begin();
				log.info("delete:" + mb.getTitle());
				pm.deletePersistent(mb);
				// tx.commit();

			}
		}

		return result;
	}
	
	//テストデータ生成用
	private void createTestBookData(PersistenceManager pm)throws Exception{
		
		// 既存オブジェクトの削除
		deleteBooks(pm);
		// books = getBooks(pm);
		// pm.deletePersistentAll(books);

		// オブジェクト永続化
		storeBook(pm, "リレーショナルデータベース");
		storeBook(pm, "フロイト入門");
		storeBook(pm, "カラマーゾフの兄弟１");

	}

	// オブジェクトキーの生成メソッド
	private Key createKey(String simple_cls_name, String key_str) {
		Key key = KeyFactory.createKey(simple_cls_name, key_str);
		return key;
	}
}
